package Interfaz;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.SWTResourceManager;

import DTO.DTOGestionarResultado;
import DTO.DTOPuntuacion;
import Excepcion.CompetenciaNoPermiteEmpateException;
import Excepcion.EmpateEnEliminacionException;
import Excepcion.EmpateSetException;
import Excepcion.EspaciosVaciosException;
import Excepcion.FaltanPartidosAnterioresException;
import Excepcion.PuntajeNegativoException;
import Excepcion.PuntajeOverflowException;
import Excepcion.ResultadoNoModificableException;
import Negocios.ControlFixture;


/**
 * CU018 - Gestionar resultados de fixture (Puntuacion)
 * @author 
 */
public class CU018_puntuacion {

	protected Shell shell;
	private Text txtPuntajeParticipante1;
	private Text txtPuntajeParticipante2;
	Button btnAusente1;
	Button btnAusente2;
	Label lblPuntajeParticipante1;
	Label lblPuntajeParticipante2;
	
	CU019 pantallaAnterior;
	
	int idCompetencia;
	int idFecha;
	int idPartido;
	
	DTOPuntuacion dtoPuntuacion;
	
	public CU018_puntuacion(int idCompetencia, CU019 pantallaAnterior,
			int idFecha, int idPartido) {
		this.idCompetencia = idCompetencia;
		this.pantallaAnterior = pantallaAnterior;
		this.idFecha = idFecha;
		this.idPartido = idPartido;
		
		ControlFixture controlFixture = new ControlFixture();
		dtoPuntuacion = controlFixture.getDTOPuntuacion(idPartido);
	}

	/**
	 * Open the window.
	 */
	public void open() {
		Display display = Display.getDefault();
		createContents();
		
		// Centrar ventana
		Monitor primary = display.getPrimaryMonitor();
		Rectangle bounds = primary.getBounds();
		Rectangle rect = shell.getBounds();	    
		int x = bounds.x + (bounds.width - rect.width) / 2;
		int y = bounds.y + (bounds.height - rect.height) / 2;	    
		shell.setLocation(x, y);
		
		Button btnGuardar = new Button(shell, SWT.NONE);
		btnGuardar.setText("Guardar");
		btnGuardar.setBounds(20, 155, 108, 32);
		btnGuardar.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				ControlFixture controlFixture = new ControlFixture();

				if (datosValidos()) {
					Integer puntaje1 = null, puntaje2 = null;
					
					if (btnAusente1.getSelection()) {
						puntaje1 = -1;
						if (btnAusente2.getSelection()) {
							puntaje2 = -1; 
						}
						else {
							puntaje2 = 0;
						}
					}
					else if (btnAusente2.getSelection()) {
						puntaje1 = 0;
						puntaje2 = -1;
					}
					else {

						puntaje1 = Integer.parseInt(txtPuntajeParticipante1.getText());
						puntaje2 = Integer.parseInt(txtPuntajeParticipante2.getText());

					}
					
					DTOGestionarResultado dtoNuevoResultado = new DTOGestionarResultado(idCompetencia,
							idPartido, puntaje1, puntaje2, -1, null, null);
					dtoNuevoResultado.setIdFecha(idFecha);
					dtoNuevoResultado.setAusente1(btnAusente1.getSelection());
					dtoNuevoResultado.setAusente2(btnAusente2.getSelection());
					
					
					


					
					
					try {
						if((!controlFixture.permiteEmpate(idCompetencia))&& (puntaje1 == puntaje2))
						{
							throw new EmpateSetException("no se permite empae");
						}
						controlFixture.gestionarResultado(dtoNuevoResultado);
						
						MessageBox mensaje = new MessageBox(shell, SWT.ICON_INFORMATION);
						mensaje.setMessage("Las puntuaciones han sido guardadas exitosamente.");
						mensaje.open();
						
						shell.close();
					}
					catch (ResultadoNoModificableException ex) {
						MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (EmpateEnEliminacionException ex) {
						MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (FaltanPartidosAnterioresException ex) {
						MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (CompetenciaNoPermiteEmpateException ex) {
						MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (PuntajeNegativoException ex) {
						MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (EspaciosVaciosException ex) {
						MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (EmpateSetException ex) {
						MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (PuntajeOverflowException ex) {
						MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
				}
			}
		});
		
		Button btnCancelar = new Button(shell, SWT.NONE);
		btnCancelar.setText("Cancelar");
		btnCancelar.setBounds(155, 155, 108, 32);
		btnCancelar.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				shell.close();
			}
		});
		
		lblPuntajeParticipante1 = new Label(shell, SWT.NONE);
		lblPuntajeParticipante1.setBounds(10, 15, 150, 15);
		
		txtPuntajeParticipante1 = new Text(shell, SWT.BORDER);
		txtPuntajeParticipante1.setBounds(10, 36, 50, 21);
		txtPuntajeParticipante1.addFocusListener(new FocusListener() {
			public void focusGained(FocusEvent e) {
				txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 255, 255));
		    }
			
		    public void focusLost(FocusEvent e) {
		    	try {
		    		if ((!btnAusente1.getSelection() && !btnAusente2.getSelection())
		    				&& (Integer.parseInt(txtPuntajeParticipante1.getText()) < 0
		    				|| Integer.parseInt(txtPuntajeParticipante1.getText()) > 9999)) {
		    			txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 153, 153));
		    		}
		    	}
		    	catch (NumberFormatException ex) {
		    		txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 153, 153));
		    	}
		    }
		});
		
		txtPuntajeParticipante2 = new Text(shell, SWT.BORDER);
		txtPuntajeParticipante2.setBounds(10, 97, 50, 21);
		txtPuntajeParticipante2.addFocusListener(new FocusListener() {
			public void focusGained(FocusEvent e) {
				txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 255, 255));
		    }
			
		    public void focusLost(FocusEvent e) {
		    	try {
		    		if ((!btnAusente1.getSelection() && !btnAusente2.getSelection())
		    				&& (Integer.parseInt(txtPuntajeParticipante2.getText()) < 0
		    				|| Integer.parseInt(txtPuntajeParticipante2.getText()) > 9999)) {
		    			txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 153, 153));
		    		}
		    	}
		    	catch (NumberFormatException ex) {
		    		txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 153, 153));
		    	}
		    }
		});
		
		lblPuntajeParticipante2 = new Label(shell, SWT.NONE);
		lblPuntajeParticipante2.setBounds(10, 76, 150, 15);
		
		btnAusente1 = new Button(shell, SWT.CHECK);
		btnAusente1.setBounds(66, 39, 85, 16);
		btnAusente1.setText("Ausente");
		btnAusente1.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				if (btnAusente1.getSelection() || btnAusente2.getSelection()) {
					txtPuntajeParticipante1.setEnabled(false);
					txtPuntajeParticipante2.setEnabled(false);
				}
				else {
					txtPuntajeParticipante1.setEnabled(true);
					txtPuntajeParticipante2.setEnabled(true);
				}
			}
		});
		
		btnAusente2 = new Button(shell, SWT.CHECK);
		btnAusente2.setText("Ausente");
		btnAusente2.setBounds(66, 101, 85, 16);
		btnAusente2.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				if (btnAusente1.getSelection() || btnAusente2.getSelection()) {
					txtPuntajeParticipante1.setEnabled(false);
					txtPuntajeParticipante2.setEnabled(false);
				}
				else {
					txtPuntajeParticipante1.setEnabled(true);
					txtPuntajeParticipante2.setEnabled(true);
				}
			}
		});
		
		lblPuntajeParticipante1.setText("Puntaje " + dtoPuntuacion.getNombreParticipante1() + ":");
		lblPuntajeParticipante2.setText("Puntaje " + dtoPuntuacion.getNombreParticipante2() + ":");
		if (dtoPuntuacion.getEdicion()) {
			if (dtoPuntuacion.getAusente1()) {
				btnAusente1.setSelection(true);
				txtPuntajeParticipante1.setEnabled(false);
				txtPuntajeParticipante2.setEnabled(false);
			}
			else {
				txtPuntajeParticipante1.setText(new Integer(dtoPuntuacion.getPuntaje1()).toString());
			}
			
			if (dtoPuntuacion.getAusente2()) {
				btnAusente2.setSelection(true);
				txtPuntajeParticipante1.setEnabled(false);
				txtPuntajeParticipante2.setEnabled(false);
			}
			else {
				txtPuntajeParticipante2.setText(new Integer(dtoPuntuacion.getPuntaje2()).toString());
			}
		}
		
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	protected boolean datosValidos() {
		try {
    		if ((!btnAusente1.getSelection() && !btnAusente2.getSelection())
    				&& (Integer.parseInt(txtPuntajeParticipante1.getText()) < 0
    				|| Integer.parseInt(txtPuntajeParticipante1.getText()) > 9999)) {
    			txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 153, 153));
    			
    			MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
    			error.setMessage("Puntaje inv\u00E1lido.\n"
    					+ "Debe ingresar un valor entero entre 0 (cero) y 9999 "
    					+ "(nueve mil novecientos noventa y nueve).");
    			error.open();
    			
    			return false;
    		}
    	}
    	catch (NumberFormatException ex) {
    		txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 153, 153));
    		
    		MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
			error.setMessage("Puntaje inv\u00E1lido.\n"
					+ "Debe ingresar un valor entero entre 0 (cero) y 9999 "
					+ "(nueve mil novecientos noventa y nueve).");
			error.open();
    		
    		return false;
    	}
		
		try {
    		if ((!btnAusente1.getSelection() && !btnAusente2.getSelection())
    				&& (Integer.parseInt(txtPuntajeParticipante2.getText()) < 0
    				|| Integer.parseInt(txtPuntajeParticipante2.getText()) > 9999)) {
    			txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 153, 153));
    			
    			MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
    			error.setMessage("Puntaje inv\u00E1lido.\n"
    					+ "Debe ingresar un valor entero entre 0 (cero) y 9999 "
    					+ "(nueve mil novecientos noventa y nueve).");
    			error.open();
    			
    			return false;
    		}
    	}
    	catch (NumberFormatException ex) {
    		txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 153, 153));
    		
    		MessageBox error = new MessageBox(shell, SWT.ICON_ERROR);
			error.setMessage("Puntaje inv\u00E1lido.\n"
					+ "Debe ingresar un valor entero entre 0 (cero) y 9999 "
					+ "(nueve mil novecientos noventa y nueve).");
			error.open();
    		
    		return false;
    	}
		
		return true;
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shell = new Shell(SWT.CLOSE | SWT.TITLE | SWT.MIN);
		shell.setSize(291, 234);
		shell.setText("Editar resultado");
		shell.addListener(SWT.Close, new Listener() {
			public void handleEvent(Event event) {
				pantallaAnterior.actualizar();
				pantallaAnterior.shlFixture.setVisible(true);
				pantallaAnterior.shlFixture.forceFocus();
			}
		});
	}
}
